union {
Program programs[GL_N_PROGRAMS];
struct {
- Program blend_program;
Program blit_program;
Program color_program;
Program coloring_program;
const char *vs;
const char *fs;
} program_definitions[] = {
- { "blend", "blend.vs.glsl", "blend.fs.glsl" },
{ "blit", "blit.vs.glsl", "blit.fs.glsl" },
{ "color", "blit.vs.glsl", "color.fs.glsl" },
{ "coloring", "blit.vs.glsl", "coloring.fs.glsl" },
gsk_private_gl_shaders = [
- 'resources/glsl/blend.fs.glsl',
- 'resources/glsl/blend.vs.glsl',
'resources/glsl/blit.fs.glsl',
'resources/glsl/blit.vs.glsl',
'resources/glsl/color.fs.glsl',
+++ /dev/null
-vec3 BlendMultiply(vec3 Cb, vec3 Cs) {
- return Cb * Cs;
-}
-
-vec3 BlendScreen(vec3 Cb, vec3 Cs) {
- return Cb + Cs - (Cb * Cs);
-}
-
-vec3 BlendHardLight(vec3 Cb, vec3 Cs) {
- vec3 m = BlendMultiply(Cb, 2.0 * Cs);
- vec3 s = BlendScreen(Cb, 2.0 * Cs - 1.0);
- vec3 edge = vec3(0.5, 0.5, 0.5);
-
- /* Use mix() and step() to avoid a branch */
- return mix(m, s, step(edge, Cs));
-}
-
-vec3 BlendOverlay(vec3 Cb, vec3 Cs) {
- return BlendHardLight(Cs, Cb);
-}
-
-vec3 BlendDarken(vec3 Cb, vec3 Cs) {
- return min(Cb, Cs);
-}
-
-vec3 BlendLighten(vec3 Cb, vec3 Cs) {
- return max(Cb, Cs);
-}
-
-void main() {
- vec4 Cs = Texture(u_source, vUv);
- vec4 Cb = Texture(u_mask, vUv);
- vec3 res;
-
- if (uBlendMode == 0) {
- res = Cs.xyz;
- }
- else if (uBlendMode == 1) {
- res = BlendMultiply(Cb.xyz, Cs.xyz);
- }
- else if (uBlendMode == 2) {
- res = BlendScreen(Cb.xyz, Cs.xyz);
- }
- else if (uBlendMode == 3) {
- res = BlendOverlay(Cb.xyz, Cs.xyz);
- }
- else if (uBlendMode == 4) {
- res = BlendDarken(Cb.xyz, Cs.xyz);
- }
- else if (uBlendMode == 5) {
- res = BlendLighten(Cb.xyz, Cs.xyz);
- }
- else if (uBlendMode == 8) {
- res = BlendHardLight(Cb.xyz, Cs.xyz);
- }
- else {
- // Use red for debugging missing blend modes
- res = vec3(1.0, 0.0, 0.0);
- }
- setOutputColor(vec4(res, Cs.a) * u_alpha);
-}